<?php

namespace Xin\LaravelFortify\Plugin;

use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Xin\LaravelFortify\Foundation\Http\ModuleContext;

class RouteServiceProvider extends ServiceProvider
{
	use WithCurrentPlugin;

	/**
	 * The module namespace to assume when generating URLs to actions.
	 */
	protected string $pluginControllerNamespace = '';

	/**
	 * @return void
	 */
	public function register()
	{
		parent::register();

		$pluginName = $this->getCurrentPluginName();
		$this->pluginControllerNamespace = "Plugins\\{$pluginName}\\App\\Http\\Controllers";
	}

	/**
	 * 在注册路由之前调用，注册任何模型绑定或基于模式的过滤器。
	 */
	public function boot(): void
	{
		parent::boot();
	}

	/**
	 * 定义应用程序的路由。
	 */
	public function map(): void
	{
		$this->mapApiRoutes();

		$this->mapWebRoutes();

		$this->mapAdminRoutes();

		$this->mapGlobalRoutes();
	}

	/**
	 * 定义应用程序的 “api” 路由。
	 */
	protected function mapApiRoutes(): void
	{
		if (ModuleContext::isAllowRegisterRoutes('api')) {
			$this->defineRoute('api', 'routes/api.php');
		}
	}

	/**
	 * 定义应用程序的 “web” 路由。
	 */
	protected function mapWebRoutes(): void
	{
		$this->defineRoute('web', 'routes/web.php');
	}


	/**
	 * 定义应用程序的 “admin” 路由。
	 */
	protected function mapAdminRoutes(): void
	{
		if (ModuleContext::isAllowRegisterRoutes('admin')) {
			$this->defineRoute('admin', 'routes/admin.php');
		}
	}


	/**
	 * 定义应用程序的 “global” 路由。
	 */
	protected function mapGlobalRoutes()
	{
	}

	/**
	 * 构建 Router
	 * @param string $module
	 * @return \Illuminate\Routing\RouteRegistrar
	 */
	protected function defineRoute($module, $routePath)
	{
		$routePath = $this->basePath($routePath);
		return optional(ModuleContext::defineRoute(
			$module,
			$routePath,
			$this->getCurrentPluginName(true)
		))->namespace($this->pluginControllerNamespace);
	}
}
